######################################################################
# File: pms.py                             Part of Python MUD Server #
#                                                                    #
# Copyright (C) 2010 by Joachim Pileborg <arrow@pileborg.org>.       #
# All rights reserved.                                               #
#                                                                    #
# Redistribution and use in source and binary forms, with or without #
# modification, are permitted provided that the following conditions #
# are met:                                                           #
#                                                                    #
#   o Redistributions of source code must retain the above copyright #
#     notice, this list of conditions and the following disclaimer.  #
#   o Redistributions in binary form must reproduce the above        #
#     copyright notice, this list of conditions and the following    #
#     disclaimer in the documentation and/or other materials         #
#     provided with the distribution.                                #
#                                                                    #
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND             #
# CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,        #
# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF           #
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE           #
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS  #
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,#
# OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,           #
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR #
# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY       #
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR     #
# TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF #
# THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF    #
# SUCH DAMAGE.                                                       #
######################################################################

import settings
import net.server
import net.protocols
import log

######################################################################

######################################################################

def init():
    log.init()
    net.server.init()      # Network initialisation
    net.protocols.init()   # Initialise the different protocols and ports

def clean():
    # TODO: Clean up (for example, save all players and states etc.)
    net.protocols.clean()
    net.server.clean()
    log.clean()

######################################################################

class Ticker(object):
    tick_counter = 0

    def __init__(self):
        super(Ticker, self).__init__()

    def tick(self):
        if settings.DEBUG:
            # Once per minute send a message to all connected users
            if (self.tick_counter % (60 * settings.TICKS_PER_SECOND)) == 0:
                net.protocols.send_all('Hello #%d\r\n' % self.tick_counter)

        # TODO: Add more code here!
        # TODO: Like code to move a monsters around, etc.

        self.tick_counter = self.tick_counter + 1

        # Schedule another tick
        from twisted.internet import reactor
        reactor.callLater(1.0 / settings.TICKS_PER_SECOND, lambda: self.tick())


######################################################################

def main(argv):
    # TODO: Parse arguments
    if len(argv) == 0:
        print('No arguments')
    else:
        for arg in argv:
            print('arg = "' + arg + '"')

    init()

    from twisted.internet import reactor
    ticker = Ticker()
    reactor.callLater(1.0 / settings.TICKS_PER_SECOND, lambda: ticker.tick())

    # This is the call that gets all going...
    net.server.run()

    # All done, better clean up after us
    clean()

######################################################################
